/*
 * CS_REQ_SLOT_LIST.cpp
 *
 *  Created on: 2013. 9. 6.
 *      Author: jjaehuny
 */

#include "world.h"

#include "../../engine.h"

#include "../../User.h"

#include "../../NLogic/Bag.h"
#include "../../NLogic/Item.h"
#include "../../NUtil/SafeArray.h"

#include <time.h>

namespace ProjectZ { namespace NCommand { namespace NWorld {

void CS_REQ_USER_INFO_INVEN_BAG::OnExecute(User * pUser, ::Network::Packet * pPacket)
{
	/*
	 * //가방별 인벤 슬롯 정보 C->S
	CS_REQ_USER_INFO_INVEN_BAG	0x0929
	{
		u8	bag_type;
	}

	//가방별 인벤 슬롯 정보
	SC_REQ_USER_INFO_INVEN_BAG	0x092A
	{
		u32	gid;    	///	게임 유니크 Key
		u8	bag_sort_type;	/// 0: 레벨별 정렬, 1: 등급별 정렬
		u8	bag_type;	///	가방타입(0: 장비(60), 1:장신구(60), 2:잡화(60), 3:퀘스트(60), 4:칭호(60), 5:페어리(40), 6:페어리알(40), 7:공용창고(60))
		u8	slot_count	/// 	반복구(MAX60회) : 가방별 인벤아이템 정보
		{
			u8	slot_idx;
			u64	item_seq;	// 아이템 seq
			u8	cur_duration;	// 내구도 현재
			u8	max_duration;
			u8	stack_num;	// 스탯된 개수
			u8	set_type	// 세트아이템타입(-1 : 없음)
			u8	non_identity;   // 미식별여부
			u8	cur_refine_step;	// 현재 제련단계
			u8	quality;
			u8	level;
			u8	eff_type0;
			u8	eff_pos0;	// 기본이펙트 : 위치
			u16	eff_value0;	// 기본이펙트 : 효과치
			u8	eff_type1;
			u8	eff_pos1;
			u16	eff_value1;
			u8	eff_type2;
			u8	eff_pos2;
			u16	eff_value2;
			u8	eff_type3;
			u8	eff_pos3;
			u16	eff_value3;
			u8	eff_type4;
			u8	eff_pos4;
			u16	eff_value4;
			u8	eff_type5;
			u8	eff_pos5;
			u16	eff_value5;
			u8	eff_type6;
			u8	eff_pos6;
			u16	eff_value6;
			u8	open_upgrade_stone_slot; // 오픈된 강화석 슬롯수
			u8	ablity_enhance_rate; 	// 기본능력치 상향
			u8	max_enhance_step;	// 제련 최대값
			u8	buy_use;	// 구매 후 바로 사용 여부
			u8	evolve_step;	// 진화단계
			u8	evolve_max; 	// 진화 최대단계
			u16	evolve_point;	// 진화포인트
			u16	evolve_eff;
			u16	evolve_eff_value;	// 진화이펙트 값
			u8	class_type;	// 장착클래스 타입
			u8	sub_type;	// 서브타입
			u16	tid;		// 테이블 아이디
		}
	}
	 */
	STRESSLOG("[CHANNEL] CS_REQ_USER_INFO_INVEN_BAG::ONEXECUTE");

	PREPARE_PACKET;

	uint8_t bag_type;

	* pPacket >> bag_type;

	NLogic::Bag * pBag = pUser->GetBag(static_cast<INVEN_BAG_TYPE>(bag_type));
	if (NULL == pBag)
	{
		DEBUGLOG("CS_REQ_USER_INFO_INVEN_BAG BAG IS NULL bag_type : %d", bag_type);
		return;
	}

	// 전투펫인 경우 스태미너 차감
	if (BAG_TYPE_BATTLE_PET == static_cast<INVEN_BAG_TYPE>(bag_type))
	{
		if (false == pBag->IsDecreaseBattlePetStamina())
			pBag->DecreaseBattlePetStamina();
	}

	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();

	User::BAG_ORDER & array = pUser->GetBagOrder();
	int resultValue = 0;
	if (false == array.GetValue(bag_type, resultValue))
	{
		DEBUGLOG("ERROR CS_REQ_USER_INFO_INVEN_BAG INVALID bag_type : %d", bag_type);
	}

	* pAck << pUser->GetUserSeq() << static_cast<uint8_t>(resultValue)
			<< bag_type << static_cast<uint8_t>(pBag->HasItemCount());

	std::for_each(pBag->GetItemVector().begin(), pBag->GetItemVector().end(), [&](NLogic::Item * pItem) {
		* pAck << static_cast<uint64_t>(pItem->GetItemSeq());
		pItem->WriteToPacket(pAck);
		DEBUGLOG("SocialID=%s, BagType=%d, ItemCount=%d, ItemSeq=%ld, TID=%d", pUser->GetSocialID().c_str(), bag_type, pBag->HasItemCount(), pItem->GetItemSeq(), pItem->GetData().tid);
	} );

	pAck->MakePacket(CMD_SC_REQ_USER_INFO_INVEN_BAG);
	pUser->Send(pAck);
}

} /*NWorld*/ } /*NCommand*/ } /*ProjectZ*/



